/**
 * @负责存放每个路由对应的处理函数
 * @用户登录和注册的路由处理函数
 */

// 导入数据库操作模块,一般叫做db
const db = require('../db')
// 导入 bcryptjs 加密密码,无法在数据库用明文查看
const bcrypt = require('bcryptjs')
// 导入生成 Token 的包
const jwt = require('jsonwebtoken')
const config = require('../config')
const { message } = require('../hook')

// 主要-- 注册
// 思路-- 1.检测表单数据是否合法 2.检测用户名是否被占用 3.对密码进行加密处理 4.插入新用户
exports.reqUserZhuce = (req, res) => {
  // 步骤-- 获取客户端提交到服务器的用户信息,意思是用户输入账号密码时候的参数
  const userInfo = req.body
  // console.log('🌈成功->信息', userInfo)
  // 步骤-- 1 对表单中的数据，进行合法性的校验,使用的是中间件的方式
  // if (!userInfo.username || !userInfo.password) return res.fa('用户名或密码不合法!')
  // 步骤-- 2 定义SQL语句,检测用户名是否被占用
  const selectSql = `select * from var_user where username=?`
  db.query(selectSql, userInfo.username, (err, results) => {
    // 执行 SQL 语句失败
    if (err) return res.fa(err)
    // 判断用户名是否被占用
    if (results.length > 1) return res.fa('用户名重复!')
    // 步骤-- 3 对密码进行加密
    userInfo.password = bcrypt.hashSync(userInfo.password, 10)
    // console.log('🌈成功->信息', userInfo)
    // 步骤-- 4 插入新用户
    const insertSql = `insert into var_user set ?`
    // 调用 db.query() 执行 SQL 语句
    db.query(insertSql, { username: userInfo.username, password: userInfo.password }, (err, results) => {
      if (err) return res.fa(err)
      // 判断影响行数是否为1
      if (results.affectedRows != 1) return res.fa('注册用户失败，请稍后再试!')
      res.send({
        code: 0,
        message: `注册成功`,
        data: null
      })
    })
  })
}

// 主要--登录
exports.reqUserLogin = (req, res) => {
  const userInfo = req.body
  const selectSql = `select * from var_user where username=?`
  db.query(selectSql, userInfo.username, (err, results) => {
    if (err) return res.fa(err)
    if (results.length > 1) return res.fa('登陆失败')
    // 拿著用户输入的密码，和数据库中存储的密码进行对比,userInfo.password:用户提交的,results[0].password 数据库的密码
    const compareRes = bcrypt.compareSync(userInfo.password, results[0].password)
    if (!compareRes) return res.fa('密码错误')

    // 在服务器端生成 Token 的字符串
    const user = { ...results[0], password: null, userpic: null }
    const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
    res.send({
      code: 0,
      message: '登录成功',
      token: `Bearer ` + tokenStr
    })
  })
}
